iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0
Mobile Development

大一之 Android Kotlin 自習心路歷程系列 第 5

[Day 5] Android in Kotlin: 高階函式 與 Lambda Function 分享

  • 分享至 

  • xImage
  •  

在剛開始學 Kotlin 後就知道有這個功能,覺得滿酷的。其實 lambdab 表達式從 Java 8 開始也有

不過在這之前,要先來看看高階函數

Function Types

底下是一個在正常的方法,有兩個參數跟回傳值

fun plus(num1: Int, num2: Int): Int{
    return num1+ num2
}

當一個 function 只有 return 值時,可以寫在等號後方表示

fun plus(num1: Int, num2: Int): Int = num1+ num2

而 Kotlin 的 function 不只有這種表示型態。
他可以像變數一樣的型態表示

val plus = fun (num1: Int, num2: Int): Int = num1+ num2

在使用上,也和一般的 function 差不多

textView.text= plus(5, 7).toString()

高階函數

有了這個概念,就可以來做「高階函數」。
所謂的高階函數,就是輸入參數或是回傳值是 function。

馬上建立一個高階函數作為例子:

fun calculate(
    num1: Int,
    num2: Int,
    operator: (Int, Int) -> Int
): String{
    return "The answer is ${operator(num1, num2)}."
}

他有三個參數,分別是兩個 Int 跟 一個回傳 Int 且需要兩個 Int 為參數的 function

而這符合剛剛 plus 的資料型態,所以最後會變成這樣

textView.text= calculate(5, 7, plus)

回傳答案:
The answer is 12.

如此一來,我再寫一個同樣型態的 function type

val minus = fun (num1: Int, num2: Int): Int = num1- num2

就可以用在同一個高階函數裡面使用

val ans1= calculate(5, 3, plus)
val ans2= calculate(5, 3, minus)

Lambda Function

Lambda function 可以將 function 簡化,且被大括號所包覆。

{參數名稱: 參數型態 -> 方法內容}
參數型態可寫可不寫要看情況決定

舉上面的計算機做為例子,建立個型態為 function 的變數:

val plus= { num1: Int, num2: Int -> 
    num1+ num2
}

其形態為「(Int, Int) -> Int」,輸入兩個整數,回傳一個整數。
所以也可以這樣寫

val plus: (Int, Int) -> Int= { num1, num2 -> 
    num1+ num2
}

在上一節做的點擊監聽器會發現,他會要我們轉成 lambda
convert to lambda

也就是上面的那個 {...} 的方法

轉完後就只剩下這樣,簡潔有力

btn.setOnClickListener { 
    TODO("Not yet implemented") 
}

在 lambda function 裡面,可以用 it 代表方法的參數。

之所以能轉是因為在 View.class 裡可以看到 OnClickListener 只有唯一一個 function。

所以可以說,這個 interface 就是為了 function 而活
換言之,如果這個 interface 有兩個以上的 function 就不能夠轉了。

interface MyClickListener : View.OnClickListener {
    override fun onClick(p0: View?)
    fun otherFunction()
}

隨手寫了一個 interface 加上 otherFunction,實現方法後,發現沒有出現轉換 lambda 的提示

btn.setOnClickListener(object : MyClickListener{
    override fun onClick(p0: View?) {
        TODO("Not yet implemented")
    }
    override fun otherFunction() {
    }
})

上一篇
[Day 4] Android in Kotlin: Object 與 Singleton
下一篇
[Day 6] Android in Kotlin: Android Studio 的開始
系列文
大一之 Android Kotlin 自習心路歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言